package org.andengine.util.modifier;

import org.andengine.engine.handler.IUpdateHandler;
import org.andengine.util.adt.list.SmartList;

/**
 * (c) 2010 Nicolas Gramlich
 * (c) 2011 Zynga Inc.
 *
 * @author Nicolas Gramlich
 * @since 14:34:57 - 03.09.2010
 */
public class ModifierList<T> extends SmartList<IModifier<T>> implements IUpdateHandler {
    // ===========================================================
    // Constants
    // ===========================================================

    private static final long serialVersionUID = 1610345592534873475L;

    // ===========================================================
    // Fields
    // ===========================================================

    private final T mTarget;

    // ===========================================================
    // Constructors
    // ===========================================================

    public ModifierList(final T pTarget) {
        this.mTarget = pTarget;
    }

    public ModifierList(final T pTarget, final int pCapacity) {
        super(pCapacity);
        this.mTarget = pTarget;
    }

    // ===========================================================
    // Getter & Setter
    // ===========================================================

    public T getTarget() {
        return this.mTarget;
    }

    // ===========================================================
    // Methods for/from SuperClass/Interfaces
    // ===========================================================

    @Override
    public boolean add(final IModifier<T> pModifier) {
        if (pModifier == null) {
            throw new IllegalArgumentException("Supplied " + IModifier.class.getSimpleName() + " must not be null.");
        } else {
            return super.add(pModifier);
        }
    }

    @Override
    public void onUpdate(final float pSecondsElapsed) {
        final int modifierCount = this.size();
        if (modifierCount > 0) {
            for (int i = modifierCount - 1; i >= 0; i--) {
                final IModifier<T> modifier = this.get(i);
                modifier.onUpdate(pSecondsElapsed, this.mTarget);
                if (modifier.isFinished() && modifier.isAutoUnregisterWhenFinished()) {
                    this.remove(i);
                }
            }
        }
    }

    @Override
    public void reset() {
        for (int i = this.size() - 1; i >= 0; i--) {
            this.get(i).reset();
        }
    }

    // ===========================================================
    // Methods
    // ===========================================================

    // ===========================================================
    // Inner and Anonymous Classes
    // ===========================================================
}
